package com.qf.fmall2204.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.fmall2204.product.entity.Product;
import com.qf.fmall2204.product.entity.ProductImg;
import com.qf.fmall2204.product.entity.ProductSku;
import com.qf.fmall2204.product.mapper.ProductImgMapper;
import com.qf.fmall2204.product.mapper.ProductMapper;
import com.qf.fmall2204.product.mapper.ProductSkuMapper;
import com.qf.fmall2204.product.service.IProductService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * <p>
 * 商品 商品信息相关表：分类表，商品图片表，商品规格表，商品参数表 服务实现类
 * </p>
 *
 * @author dong
 * @since 2023-04-21
 */
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Autowired
    ProductImgMapper productImgMapper;

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Autowired
    ProductSkuMapper productSkuMapper;

    @Override
    public List<Product> listRecommends() {

        //1. 查询最新上架的三个商品
        List<Product> productList = this.list(new QueryWrapper<Product>().orderByDesc("create_time").last("limit 3"));

        //2. 填充图片信息到商品中
        populateProductImg(productList);

        return productList;
    }

    //  填充图片信息到商品中
    public void populateProductImg(List<Product> productList) {

//        for (Product product : productList) {
//            String productId = product.getProductId();
//            List<ProductImg> productImgs =
//                    productImgMapper.selectList(new QueryWrapper<ProductImg>().eq("item_id", productId));
//            product.setImgs(productImgs);
//        }

        //1. 根据传入的商品List，把所有商品的图片信息一次性都查询出来
        //1.1 List<Product> ===> List<商品ID>
//        List<String> productIdList = productList.stream().map(product -> product.getProductId()).collect(Collectors.toList());
        List<String> productIdList = productList.stream().map(Product::getProductId).collect(Collectors.toList());

        //1.2 SELECT * FROM product_img WHERE item_id IN (1,3,6);
        List<ProductImg> productImgList = productImgMapper.selectList(new QueryWrapper<ProductImg>().in("item_id", productIdList));


        //2. 处理查询到的商品图片数据
        // 需要一个Map结构，  key=商品的id， value=List<这个商品对于的图片>
        // List<ProductImg> productImgList ==>  Map<商品ID，List<这个商品对于的图片>>
        Map<String, List<ProductImg>> productImgMap = productImgList.stream().collect(Collectors.groupingBy(ProductImg::getItemId));

        for (Product product : productList) {
            String productId = product.getProductId();
            List<ProductImg> productImgs = productImgMap.get(productId);
            if (productImgs == null){
                product.setImgs(new ArrayList<ProductImg>()); // 如果没有匹配的商品图片，创建一个size=0的list，避免前端js报错
            }else {
                product.setImgs(productImgs);
            }
        }


    }

    /**
     *      * product {}
     *      * productSkus []
     *      * productImgs []
     * @param id
     * @return
     */
    @Override
    public HashMap<String, Object> detailInfo(Integer id) {

        // 1. 根据id查询商品的基本信息
        Product product = this.getById(id);

        // 2. 查询商品的sku 信息
        List<ProductSku> productSkus = productSkuMapper.selectList(new QueryWrapper<ProductSku>().eq("product_id", id));

        // 3. 查询商品图片信息
        List<ProductImg> productImgs = productImgMapper.selectList(new QueryWrapper<ProductImg>().eq("item_id", id));

        HashMap<String, Object> map = new HashMap<>();

        map.put("product",product);
        map.put("productSkus",productSkus);
        map.put("productImgs",productImgs);

        return map;
    }
}
